package org.javahispano.javacup.tacticas_aceptadas.LucasTG;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.EstiloUniforme;
import org.javahispano.javacup.modelo.JugadorDetalle;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

public class TacticaHuracanTA implements Tactica {

    Posicion alineacionSaque[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-19.46564885496183,-31.6044776119403),
        new Posicion(0.2595419847328244,-31.082089552238806),
        new Posicion(19.984732824427482,-31.6044776119403),
        new Posicion(1.188811188811189,-12.352941176470589),
        new Posicion(-11.601398601398602,-31.463800904977376),
        new Posicion(-25.678321678321677,-4.513574660633484),
        new Posicion(16.643356643356643,-6.651583710407239),
        new Posicion(-1.4265734265734267,-0.7126696832579186),
        new Posicion(2.377622377622378,-2.1380090497737556),
        new Posicion(25.678321678321677,-16.153846153846153)
    };

    Posicion alineacionJuego[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-19.020979020979023,-30.6447963800905),
        new Posicion(6.895104895104895,-32.07013574660634),
        new Posicion(18.06993006993007,-25.656108597285066),
        new Posicion(-8.797202797202797,-23.755656108597286),
        new Posicion(-12.839160839160838,-3.800904977375566),
        new Posicion(-22.58741258741259,23.28054298642534),
        new Posicion(4.041958041958042,-14.490950226244346),
        new Posicion(-2.8531468531468533,33.257918552036195),
        new Posicion(-0.2595419847328244,19.067164179104477),
        new Posicion(25.44055944055944,27.556561085972852)
    };

    Posicion alineacionNoSaque[]=new Posicion[]{
        new Posicion(0.2595419847328244,-50.41044776119403),
        new Posicion(-11.16030534351145,-31.082089552238806),
        new Posicion(11.16030534351145,-31.6044776119403),
        new Posicion(26.732824427480914,-20.111940298507463),
        new Posicion(-29.32824427480916,-21.67910447761194),
        new Posicion(4.041958041958042,-15.441176470588236),
        new Posicion(-18.946564885496183,-0.26119402985074625),
        new Posicion(18.946564885496183,-0.26119402985074625),
        new Posicion(-12.839160839160838,-15.203619909502263),
        new Posicion(-24.727272727272727,-10.690045248868778),
        new Posicion(14.97902097902098,-13.303167420814479)
    };

    class TacticaHuracanTADetalle implements TacticaDetalle {

        public String getNombre() {
            return "Huracan T A 04";
        }

        public String getPais() {
            return "Argentina";
        }

        public String getEntrenador() {
            return "Lucas Tomas Goicoechea";
        }

        public Color getColorCamiseta() {
            return new Color(144, 127, 153);
        }

        public Color getColorPantalon() {
            return new Color(23, 148, 96);
        }

        public Color getColorFranja() {
            return new Color(228, 224, 233);
        }

        public Color getColorCalcetas() {
            return new Color(158, 130, 136);
        }

        public Color getColorPortero() {
            return new Color(137, 75, 199        );
        }

        public EstiloUniforme getEstilo() {
            return EstiloUniforme.LINEAS_VERTICALES;
        }

        public Color getColorCamiseta2() {
            return new Color(80, 91, 101);
        }

        public Color getColorPantalon2() {
            return new Color(102, 204, 0);
        }

        public Color getColorFranja2() {
            return new Color(0, 56, 117);
        }

        public Color getColorCalcetas2() {
            return new Color(51, 0, 153);
        }

        public Color getColorPortero2() {
            return new Color(103, 162, 207);
        }

        public EstiloUniforme getEstilo2() {
            return EstiloUniforme.LINEAS_VERTICALES;
        }

        class JugadorImpl implements JugadorDetalle {

            String nombre;
            int numero;
            Color piel, pelo;
            double velocidad, remate, presicion;
            boolean portero;
            Posicion posicion;

            public JugadorImpl(String nombre, int numero, Color piel, Color pelo,
                    double velocidad, double remate, double presicion, boolean portero) {
                this.nombre=nombre;
                this.numero=numero;
                this.piel=piel;
                this.pelo=pelo;
                this.velocidad=velocidad;
                this.remate=remate;
                this.presicion=presicion;
                this.portero=portero;
            }

            public String getNombre() {
                return nombre;
            }

            public Color getColorPiel() {
                return piel;
            }

            public Color getColorPelo() {
                return pelo;
            }

            public int getNumero() {
                return numero;
            }

            public boolean esPortero() {
                return portero;
            }

            public double getVelocidad() {
                return velocidad;
            }

            public double getRemate() {
                return remate;
            }

            public double getPresicion() {
                return presicion;
            }

        }

        public JugadorDetalle[] getJugadores() {
            return new JugadorDetalle[]{
                new JugadorImpl("LoTartaro", 1, new Color(150,132,116), new Color(219,233,149),1.0d,1.0d,0.33d, true),
                new JugadorImpl("Malaguenio", 2, new Color(255,200,150), new Color(50,0,0),1.0d,0.59d,0.0d, false),
                new JugadorImpl("Quintana", 3, new Color(255,200,150), new Color(50,0,0),1.0d,0.47d,0.0d, false),
                new JugadorImpl("Dragojevich M", 4, new Color(255,200,150), new Color(50,0,0),1.0d,0.4d,0.0d, false),
                new JugadorImpl("Dragojevich I", 5, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                new JugadorImpl("Gomez", 6, new Color(219,194,171), new Color(50,0,0),1.0d,1.0d,0.71d, false),
                new JugadorImpl("Gonzalez", 7, new Color(255,222,191), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                new JugadorImpl("Natalichio", 8, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                new JugadorImpl("Garcia", 9, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                new JugadorImpl("Izquierdo", 10, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false),
                new JugadorImpl("Galvan", 11, new Color(255,200,150), new Color(50,0,0),1.0d,1.0d,1.0d, false)
            };
        }
    }
    
    TacticaDetalle detalle=new TacticaHuracanTADetalle();
    public TacticaDetalle getDetalle() {
        return detalle;
    }

    public Posicion[] getPosicionSaca(SituacionPartido sp) {
    return alineacionSaque;
    }

    public Posicion[] getPosicionRecive(SituacionPartido sp) {
    return alineacionNoSaque;
    }

    
    
    ArrayList<Comando> comandos = new ArrayList<Comando>();
    Random r = new Random();
    boolean antSaco = false;
    int itersaco = 0;
    Jugador[] jugadores = new Jugador[]{
    		new Jugador(5,5),
    		new Jugador(5,5),
    		new Jugador(5,5),
    		new Jugador(5,5),
    		new Jugador(5,5),
    		new Jugador(9,8),
    		new Jugador(8,10),
    		new Jugador(10,8),
    		new Jugador(10,10),
    		new Jugador(8,10),
    		new Jugador(8,8)
    };
    
    Estrategia estrategia  = new EstrategiaSimple(jugadores);
    
    public List<Comando> ejecutar(SituacionPartido sp) {
    	comandos.clear();
        if (!antSaco && sp.saco()) {
            itersaco = 20;
        }
        if (itersaco > 0) {
            itersaco--;
        }
        /*for (int i = 0; i < 11; i++) {
        	comandos.add(new ComandoIrA(i, alineacionJuego[i]));
        }
        Posicion[] pos = sp.misJugadores();
        comandos.add(new ComandoIrA(sp.balon().indiceMasCercano(pos), sp.balon()));*/
       if(((sp.balon().getY() > ((Constantes.LARGO_CAMPO_JUEGO/2)-0.3)) 
        		&(sp.balon().getY() < ((Constantes.LARGO_CAMPO_JUEGO/2)+0.3))) 
        	& ((sp.balon().getX()>(-3.5)) & (3.5>sp.balon().getX()))){
        	//System.err.println("Altura:"+sp.alturaBalon());
        }
        
        if (itersaco == 0) {
        	for (int i = 0; i < 11; i++) {
        		List<Comando> listaCmd = estrategia.generarComandos(sp, i, jugadores);
        		for (Comando cmdTmp : listaCmd){
        			comandos.add(cmdTmp);
        		}
            }
                    }
        antSaco = sp.saco();
        if(elegirEstrategia(sp)!=null){ 
         if(!estrategia.comparar(elegirEstrategia(sp))) estrategia = elegirEstrategia(sp);
         }
        estrategia.setBalonAnterior(sp.balon());
        return comandos;
         }

	private Estrategia elegirEstrategia(SituacionPartido sp) {
		// Devuelve una instancia de alguna estrategia segun iteracion,goles propios,goles rivales
		Estrategia estrategiaIO = new EstrategiaSimple(jugadores);
		if (sp.iteracion() > (Constantes.ITERACIONES*(0.75))){ 
		         if (sp.golesPropios() < sp.golesRival()) {estrategiaIO = new EstrategicaOfensiva(jugadores);}		         
		         else {
		        	 if (sp.golesPropios() > sp.golesRival()) {estrategiaIO = new EstrategicaDiosDeNueve(jugadores);}
		        	    else  { estrategiaIO = new EstrategicaBianchi(jugadores);}
		         }}
		else { if(sp.iteracion() > (Constantes.ITERACIONES*(0.5))){  
		         if ((sp.golesPropios() - sp.golesRival()) > 1) { estrategiaIO = new EstrategiaDefensiva(jugadores);}
		          else if (0 > (sp.golesPropios() - sp.golesRival()) ) {  estrategiaIO = new EstrategicaOfensiva(jugadores);}
		        	  else {  estrategiaIO = new EstrategicaBianchi(jugadores);}
		          }
		}

		return estrategiaIO;
	}
}